package smallfrench.moteur.interp.err;

import smallfrench.moteur.biblio.AObjet;
import smallfrench.moteur.biblio.RClasse;
import smallfrench.moteur.biblio.err.AException;
import smallfrench.moteur.lexer.Position;
import smallfrench.moteur.lexer.Positionnable;

/**
 * Emballe une {@link AException}, une exception smallFrench.
 * @author antoine1023
 *
 */

@SuppressWarnings("serial")
public class RException extends RuntimeException implements Positionnable {

	public final AException exception;

	/**
	 * L'objet enfant, peut être différent de exception si il en est dérivé
	 */
	public final AObjet aObjet;

	public RException(AException exception) {
		super("RException");

		this.exception = exception;
		this.aObjet = exception;
	}

	public RException(AObjet aObjet) {
		super("RException");

		if (aObjet instanceof AException)
			this.exception = (AException)aObjet;
		else {
			// aObjet est dérivé de AException.
			AObjet superObj = aObjet.getSuperObjetNatif(AException.class);
			this.exception = (AException) superObj;
		}

		this.aObjet = aObjet;
	}

	public void empilerPosition(Position position) {
		exception.ajouterPosition(position);
	}

	public void empilerSiAucune(Position position) {
		exception.empilerSiAucune(position);
	}

	@Override
	public Position getPosition() {
		return exception.getPosition();
	}

	public boolean estUne(RClasse c) {
		return aObjet.classe.estUne(c);
	}

	@Override
	public final String toString() {
		return "RException (" + aObjet.classe + ")";
	}
}
